package com.xinggq.pay.service.pay.channel.yse.pay.wxpay.dto;

import cn.hutool.core.date.DateUtil;
import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;
import lombok.Data;

/**
 * @Description
 * @Author xinggq
 * @Date 2025/9/9
 */
@Data
public class YseWxPayResqDTO {

  /**
   * 商户系统生成的订单号，须保证在商户端不重复，生成规则前8位必须为交易日期，如20220525，范围跨度支持包含当天在内的前后一天，且只能由大小写英文字母、数字、下划线及横杠组成，示例值：202205256843192280647118
   */
  @NotBlank(message = "订单号不能为空")
  @JsonProperty("out_trade_no")
  private String outTradeNo;

  /**
   * 订单备注
   */
  @NotBlank(message = "订单备注不能为空")
  @JsonProperty("subject")
  private String subject;

  /**
   * 该笔订单的资金总额，单位为RMB-Yuan。取值范围为[0.01，100000000.00]，精确到小数点后两位。Number(10,2)指10位长度，2位精度。100
   */
  @NotNull(message = "订单金额不能为空")
  @JsonProperty("total_amount")
  private BigDecimal totalAmount;

  /**
   * 收款商户号
   */
  @NotBlank(message = "收款商户号不能为空")
  @JsonProperty("seller_id")
  private String sellerId;

  /**
   * 默认CNY（人民币）
   */
  @JsonProperty("currency")
  private String currency;
  /**
   * 设置未付款交易的超时时间，一旦超时，该笔交易就会自动被关闭，取值范围：1m～15d。m-分钟，h-小时，d-天。
   * 该参数数值不接受小数点，如1.5h，可转换为90m。
   * 注意：设置了未付款交易超时时间的情况下，若我司在限定时间内没有收到成功支付通知，则会关闭交易，关闭后该笔交易若付款方支付成功的情况下，会自动原路退款至付款方。 96h
   */
  @JsonProperty("timeout_express")
  private String timeoutExpress;
  /**
   * 商户系统的交易发生日期格式yyyyMMdd 20180525
   */
  @JsonProperty("shopdate")
  private String shopdate;
  /**
   * 业务代码 ，请联系银盛客户经理获取。注意：业务代码非固定值，不同到账方式需要传不同的业务代码
   */
  @NotBlank(message = "业务代码不能为空")
  @JsonProperty("business_code")
  private String businessCode;

  /**
   * 商户在微信侧申请的小程序或公众号APPID。当发起公众号支付时，需填写公众号的APPID(应用ID)；当发起小程序支付时，需填写小程序的APPID(应用ID)
   */
  @NotBlank(message = "商家公众号或小程序的openid不能为空")
  @JsonProperty("appid")
  private String appid;

  /**
   * 用户在商户appid下的授权唯一标识。
   */
  @NotBlank(message = "用户在商户appid下的唯一标识不能为空")
  @JsonProperty("sub_openid")
  private String subOpenid;


  /**
   * 【微信小程序支付：1】，【 微信公众号支付：2或不传】
   */
  @NotBlank(message = "微信支付方式不能为空，【微信小程序支付：1】，【 微信公众号支付：2或不传】")
  @JsonProperty("is_minipg")
  private String isMinipg;

  private static final String MP = "2";
  private static final String MINI = "1";

  /**
   * 构建微信小程序支付参数
   * @return
   */
  public static YseWxPayResqDTO buildYseMiniWeChatPayResqDTO() {
    YseWxPayResqDTO yseQrPayResqDTO = buildYseWeChatPayResqDTO();
    yseQrPayResqDTO.setIsMinipg(MINI);
    return yseQrPayResqDTO;
  }

  /**
   * 构建微信公众号支付参数
   * @return
   */
  public static YseWxPayResqDTO buildYseMpWeChatPayResqDTO() {
    YseWxPayResqDTO yseQrPayResqDTO = buildYseWeChatPayResqDTO();
    yseQrPayResqDTO.setIsMinipg(MP);
    return yseQrPayResqDTO;
  }

  /**
   * 构建微信支付参数
   * @return
   */
  private static YseWxPayResqDTO buildYseWeChatPayResqDTO() {
    YseWxPayResqDTO yseQrPayResqDTO = new YseWxPayResqDTO();
    yseQrPayResqDTO.setCurrency("CNY");
    yseQrPayResqDTO.setTimeoutExpress("6h");
    yseQrPayResqDTO.setShopdate(DateUtil.format(new Date(), "yyyyMMdd"));
    return yseQrPayResqDTO;
  }


}
